Вход

Просмотр полной версии : Расчет стоимости услуг


adoafw
17.01.2015, 01:26
Здравствуйте, я только начал с js работать и есть задача калькулятор услуг. Обычный калькулятор дался легко и с ним проблем небыло, но когда встала задача о том что нужно изменять сумму в зависимости от шага у меня появилась проблема вроде все верно)) но в итоге по нулям))

//calc.php

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">Расчет стоимости</h4>
</div>
<div class="modal-body">

<label for="0_val">Количество компьютеров</label>
<input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/>
<p>Итог: <span id="result">0</span> руб.</p>
<hr>
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
//calc.php-end

//calc.js

function calc() {
var summa = 0;
var col_minus = 0;
var mass = [
{"id":0,"col":[0,6,11,16,21,31],"price":[100,95,90,85,100,75]},
{"id":1,"col":[0],"price":[200]}
];

var mass_id = document.getElementById(mass[i]["id"] + '_val');// я так понял с id="0_val"

for (var i = 0; i < mass.length; i++) {

var kol = 0;
var kol = parseInt(mass_id.value, 10);

if ( (kol<0) || isNaN(kol) )
{
kol = 0;
mass_id.value = 0;
}

for ( col_minus = mass[i]["col"].length-1; mass[i]["col"][col_minus]> kol && col_minus>0; col_minus-- );

cena = mass[i]["price"][col_minus];
summa += cena*kol;


if (mass[i].id == 0) {
price_comp = kol;
}



}
var price_comp;

result.innerHTML = summa;


//calc.js-end



ps куски кода собирал))

Noobloid
17.01.2015, 03:09
<div class="modal-body">

<label for="0_val">Количество компьютеров</label>
<input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/>
<p>Итог: <span id="result">0</span> руб.</p>
<hr>
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>

<script>
function calc() {
var ammount = document.getElementById("0_val").value;//

var mass = [
{"id":0,
"col":[0,6,11,16,21,31],
"price":[100,95,90,85,80,75]},

{"id":1,
"col":[0],
"price":[200]}
];
for (var i in mass[0].col)
{
i=parseInt(i);
if(ammount >= Math.max.apply(Math, mass[0].col)){
document.getElementById("result").innerText = Math.min.apply(Math, mass[0].price)*ammount;
break;
}else if(ammount>mass[0].col[i] && ammount<=mass[0].col[i+1]){
document.getElementById("result").innerText = mass[0].price[i]*ammount;
break;
}
}
}

</script>


От как-то так получилось, не очень понял зачем 2 объекта в mass, использовал только первый но вроде считает. Переправил ряд с
100,95,90,85,100,75
на
100,95,90,85,80,75
) вроде работает

adoafw
17.01.2015, 14:19
<div class="modal-body">

<label for="0_val">Количество компьютеров</label>
<input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/>
<label for="1_val">Количество Серверов</label>
<input type="number" size="4" value="0" min="0" onchange="calc()" id="1_val" autofocus><br/>

<p>Итог: <span id="result">0</span> руб.</p>
<hr>
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>



function calc() {
var ammount = document.getElementById("0_val").value; //
var ammount1 = document.getElementById("1_val").value;
var v1, v2, total_price;

var mass = [{
"id": 0,
"col": [0, 6, 11, 16, 21, 31],
"price": [100, 95, 90, 85, 80, 75]
},

{
"id": 1,
"col": [0, 6, 11, 16, 21, 31],
"price": [100, 95, 90, 85, 80, 75]
}];

for (var i in mass[0].col) {
i = parseInt(i);
if (ammount >= Math.max.apply(Math, mass[0].col)) {
v1 = Math.min.apply(Math, mass[0].price) * ammount;
break;
} else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) {
v1 = mass[0].price[i] * ammount;
break;
}
}
for (var i in mass[1].col) {
i = parseInt(i);
if (ammount1 >= Math.max.apply(Math, mass[1].col)) {
v2 = Math.min.apply(Math, mass[0].price) * ammount1;
break;
} else if (ammount1 > mass[1].col[i] && ammount1 <= mass[1].col[i + 1]) {
v2 = mass[1].price[i] * ammount1;
break;
}
}

var total_price = ( v1 + v2);
result.innerHTML = total_price;


}



Добавил еще одну услугу и тут такая проблемка.

Если выбирать тольку одну услугу пишет NaN рублей, но я не могу понять почему total_price ничему не равно))

Noobloid
17.01.2015, 15:04
в <script> на 4-й строчке задай значения для v1=0, v2=0, total_price=0. Ошибка на 31-й строчке- ты берёш минмальное значение с mass[0], а должен с mass[0]. Пока значения в них одинаковые- проблемм нет, но когда поменяеш на рабочие цифры- огребёш по полной от менеджеров которые должны будут объяснять клиентам куда делась их скидка :)

adoafw
17.01.2015, 15:17
сделал как Вы сказали сработало) сменил для 2 услуги другие значения
то вроде работает)) Сменил на рабочие цифры где я могу тут огрести))??


function calc() {
var ammount = document.getElementById("0_val").value; //
var ammount1 = document.getElementById("1_val").value;
var v1=0, v2=0, total_price=0;

var mass = [{
"id": 0,
"col": [0, 5, 10, 15, 20, 30],
"price": [5000, 4000, 3000, 2000, 1500, 1000]
},

{
"id": 1,
"col": [0, 5, 10, 15, 20, 30],
"price": [10000, 5000, 4000, 3000, 2000, 1000]
}];

for (var i in mass[0].col) {
i = parseInt(i);
if (ammount >= Math.max.apply(Math, mass[0].col)) {
v1 = Math.min.apply(Math, mass[0].price) * ammount;
break;
} else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) {
v1 = mass[0].price[i] * ammount;
break;
}
}
for (var i in mass[1].col) {
i = parseInt(i);
if (ammount1 >= Math.max.apply(Math, mass[1].col)) {
v2 = Math.min.apply(Math, mass[1].price) * ammount1;
break;
} else if (ammount1 > mass[1].col[i] && ammount1 <= mass[1].col[i + 1]) {
v2 = mass[1].price[i] * ammount1;
break;
}
}

var total_price = ( v1 + v2);
result.innerHTML = total_price;


}

Noobloid
17.01.2015, 15:27
Уже нигде, а до этого брал минимальную стоимость для серверов с компов

adoafw
17.01.2015, 15:38
Спасибо большое Вам за помощь)) даже понял кучу всего пока разбирал Ваш код)) Тема закрыта))

PS Хотел спросить вот первое условие я понял, если шаг (числовое значение 0_val) больше или равно максимальному значению из обьекта col в массиве, то v1 присваиваем минимальное значение в обьекте price умноженную на шаг. А второе я не могу понять для чего) если не сложно обьясните)

Noobloid
17.01.2015, 15:54
for (var i in mass[0].col) {//прогоняем через все значения количеств в массиве
i = parseInt(i);
if (ammount >= Math.max.apply(Math, mass[0].col)) {//это должно срабатывать в самом конце если вообще дойдёт сюда
v1 = Math.min.apply(Math, mass[0].price) * ammount;
break;
} else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) {//если количесво введёное юзером больше чем "mass[0].col[i]" и меньше чем "mass[0].col[i+1]" (т.е. находится между соседних значений в массиве) то высчитываем значение и обрываем for loop. Но тут есть проблемма- если i дойдёт до последнего значения в массиве то mass[0].col[i + 1] выдаст ошибку поскольку в массиве нет индекса [i + 1], чтобы этого избежать сделан первый if statement- если количесво введёное пользователем больше или равно максимальному значению в массиве- то вычисляем сумму по минимальному значению в массиве цен и обрываем for loop чтобы не получить ошибки с mass[0].col[i + 1]
v1 = mass[0].price[i] * ammount;
break;
}
}


Как смог так пояснил

adoafw
17.01.2015, 15:58
Спасибо большое)) Адекватное пояснение)

Noobloid
17.01.2015, 16:02
если шаг (числовое значение 0_val)
посмотри на это с другой стороны, есть количество товаров, и есть цена которая зависит от количества